<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\BinaryFileResponse;  

class Cors
{
    /**  
     * Handle an incoming request.  
     *  
     * @param  \Illuminate\Http\Request  $request  
     * @param  \Closure  $next  
     * @return mixed  
     */
    // public function handle($request, Closure $next)  
    // {  
    //     $response = $next($request);  

    //     // 允许跨域请求的源，这里为了示例设置为 '*'，实际开发中应限制为具体的域名  
    //     $response->header('Access-Control-Allow-Origin', '*');  

    //     // 允许跨域请求的方法，如 GET, POST, PUT, DELETE 等  
    //     $response->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');  

    //     // 允许跨域请求时携带的自定义头部字段  
    //     $response->header('Access-Control-Allow-Headers', 'Content-Type, X-Auth-Token, Origin, Authorization');  

    //     // 允许浏览器在预检请求中缓存结果，以减轻服务器的负担  
    //     $response->header('Access-Control-Max-Age', '86400');  

    //     // 跨域请求时是否携带凭据（如 cookie）  
    //     // $response->header('Access-Control-Allow-Credentials', 'true'); // 注意：如果设置为 true，则 Access-Control-Allow-Origin 不能为 '*'  

    //     return $response;  
    // }  


    public function handle($request, Closure $next)
    {
        // 处理预检请求（如 OPTIONS）  
        if ($request->isMethod('OPTIONS')) {
            return response('', Response::HTTP_OK)
                ->header('Access-Control-Allow-Origin', '*') // 实际开发中应限制为具体的域名  
                ->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS')
                ->header('Access-Control-Allow-Headers', 'Content-Type, X-Auth-Token, Origin, Authorization')
                ->header('Access-Control-Max-Age', '86400');
        }

        $response = $next($request);

        if (!$response instanceof BinaryFileResponse) {
            // 允许跨域请求的源，这里为了示例设置为 '*'，实际开发中应限制为具体的域名  
            $response->header('Access-Control-Allow-Origin', '*');

            // 允许跨域请求的方法，如 GET, POST, PUT, DELETE 等  
            $response->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');

            // 允许跨域请求时携带的自定义头部字段  
            $response->header('Access-Control-Allow-Headers', 'Content-Type, X-Auth-Token, Origin, Authorization');

            // 允许浏览器在预检请求中缓存结果，以减轻服务器的负担  
            $response->header('Access-Control-Max-Age', '86400');

            // 如果需要支持跨域请求时携带凭据（如 cookie），取消以下行的注释  
            // 注意：如果设置为 true，则 Access-Control-Allow-Origin 不能为 '*'，必须是一个具体的域名  
            // $response->header('Access-Control-Allow-Credentials', 'true');  
        }

        return $response;
    }
}
